package algo_lignes_sites.data.segment;

import algo_lignes_sites.data.junction.A_Junction;
import algo_lignes_sites.data.junction.JunctionDER;
import algo_lignes_sites.data.junction.JunctionREF;
import algo_lignes_sites.data.path.A_Path;
import commons.ihm.ParametresAffichageCarto;
import commons.drawing.I_Drawable;
import commons.drawing.SegmentDrawable;
import commons.logs.Logger;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import commons.spatialindex.I_SpatialIndexable;
import commons.utils.UtilsGeom;
import commons.utils.primitive_geom.Point_d;
import commons.utils.primitive_geom.Segment_d;

/**
 * Représente un segment avec 2 Junctions comme extrémité
 */
public abstract class A_AlgolineSegment extends SegmentDrawable implements I_SpatialIndexable, I_Drawable, Comparable<A_AlgolineSegment> {

	@Override
	public int compareTo(A_AlgolineSegment o) {
		return this.path.id<o.path.id ? -1 : (this.path.id==o.path.id ? 0 : 1);
	}

	public A_Path path;
	public double angle;
	

	public A_AlgolineSegment(A_Path path, A_Junction j1, A_Junction j2) {
		// les largeurs sont définie juste au debut de draw(), car elles dependent de l'échelle
		super(j1, j2, path.getColor(), -1, -1);
		this.path = path;
		updateAngle();
	}

	// Fait un lien entre un segment REF et son équivalent DER
	// Appelé par Data, à la fin de la création de tous les segments
	static public void setLinkedREFDER (SegmentREF segREF, SegmentDER segDER) {
		assert(((JunctionDER)segDER.pt1).getJunctionREF() == segREF.pt1);
		assert(((JunctionDER)segDER.pt2).getJunctionREF() == segREF.pt2);
		assert(((JunctionREF)segREF.pt1).getJunctionDER() == segDER.pt1);
		assert(((JunctionREF)segREF.pt2).getJunctionDER() == segDER.pt2);

		segREF.segDER = segDER;
		segDER.segREF = segREF;
	}

	
	// calcule un angle entre [0 et 2.PI[
	public final void updateAngle() {
		if (pt1.equalsXY(pt2)) {
			angle = Double.NaN;
			Logger.log_DEBUG1("computeAngle() : segment vide");
		} else {
			angle = Math.acos((pt2.x-pt1.x)/pt1.distTo(pt2));
			if ((pt2.y-pt1.y) < 0)
			    angle = 2*Math.PI - angle;
		}
	}


	//**************************************************************************
	//  IDrawable
	//**************************************************************************

	@Override
	public void draw(Graphics2D g, ParametresAffichageCarto pac) {
		// On met a jour les largeur, qui ont pu changer du fait d'un changement d'échelle
		super.width_reel_m = path.epaisseurTrait_reel_m;
		super.width_topo_px = path.epaisseur_topo_px;
		super.draw(g, pac);
	}


	@Override
	public String getInfoBulle() {
		return path.getInfoBulle();
	}

	@Override
	public String getInfoDetaillee() {
		String res = super.getInfoDetaillee();
		return res;
	}
	@Override
	public String toString() {return getInfoBulle();}


}
